package com.yudongyang.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @ClassName: StreamUtil 
 * @Description: 流处理工具类
 * @author: 于鱼
 * @date: 2020年8月18日 下午6:50:19
 */
public class StreamUtil {

	/**
	 * 功能：批量关闭流。
	 *
	 * @param AutoCloseable... closeables 多个可关闭的对象
	 * @throws Exception
	 */
	public static void closings(AutoCloseable... closeables) throws Exception {
		if (closeables == null || closeables.length == 0)
			throw new IllegalArgumentException("参数不能为空");

		for (AutoCloseable autoCloseable : closeables) {
			try {
				autoCloseable.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				autoCloseable.close();
			}
		}

	}

	/**
	 * 功能：流处理，默认不关闭流
	 *
	 * @param InputStream  inputStream 输入流
	 * @param OutputStream outputStream 输出流
	 * @throws Exception
	 */
	public static void copy(InputStream inputStream, OutputStream outputStream) throws Exception {

		byte[] b = new byte[1024];
		int len;
		while ((len = inputStream.read(b)) != -1) {
			outputStream.write(b, 0, len);
		}
		closings(inputStream, outputStream);

	}

	/**
	 * 功能：读取文本文件，默认编码为UTF-8
	 *
	 * @param File    textFile 文本文件
	 * @param boolean isClose 读完后是否关闭流
	 *
	 * @return 字符串
	 * @throws Exception
	 */
	public static String asString(File textFile, boolean isClose) throws Exception {
		FileInputStream inputStream = new FileInputStream(textFile);

		byte[] b = new byte[1024];
		StringBuffer sb = new StringBuffer();

		int len;
		while ((len = inputStream.read(b)) != -1) {
			sb.append(new String(b, "UTF-8"));
		}
		if (isClose) {
			closings(inputStream);
		}
		return sb.toString();

	}

	/**
	 * 功能：按行读取文本文件，返回一个List集合，默认编码为UTF-8，默认关闭流
	 *
	 * @param File    textFile 文本文件
	 * @param String  encode 指定编码
	 * @param boolean isClose 处理完成后是否关闭流
	 *
	 * @return 字符串集合
	 */
	
	public static List<String> readingLineFormTextFile(File textFile) {

		try {
			return readingLineFormTextFile(new FileInputStream(textFile));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 功能：按行读取文本文件，返回一个List集合，默认编码为UTF-8，默认关闭流
	 *
	 * @param File    textFile 文本文件
	 * @param String  encode 指定编码
	 * @param boolean isClose 处理完成后是否关闭流
	 *
	 * @return 字符串集合
	 */
	public static List<String> readingLineFormTextFile(InputStream inputStream) {
		List<String> list = new ArrayList<String>();

		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
			String str;
			while ((str = reader.readLine()) != null) {
				list.add(str);
			}
		} catch (IOException e) {

			e.printStackTrace();
		}
		return list;
	}
}
